-- 当行注释
--[[
多行珠海市
再来一行
--]]
print("sss lua")
print("sffds")

--全局变量

print(b)

b=10
print(b)

--删除一个全局变量
print(b)

b=nil

print(b)


--多行
html = [[
<html>
<head></head>
<body>
    <a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>
]]
print(html)


--字符串拼接
print("abc".."ddds")
--数字拼接dir
print(123 .. 456)
--计算字符串长度
print(#"abcd")
--字符串和数字进行运算
print("123"+22)
print("3"*22)

--- 表 list
local x = {"apple","pear","orage","grape"}
for key,val in pairs(x) do 
	print("key",key)

end
--- 表 map
local table2 = {name="小米",age="12",sex='女'}

for key ,value in pairs(table2) do 
	print(key.." : "..value)

end

---表  排序
local table3 = {1,6,2,8,9,3,4,7,5}
--定义个排序规则方法
local function sortfunction( a,b )
	return a>b
end
--输出
table.sort( table3, sortfunction )
for i,v in ipairs(table3) do
	print(i,v)
end


--------递归
function factorial1(n)
    if n == 0 then
        return 1
    else
    	print(n)
        return n * factorial1(n - 1)
    end
end
print(factorial1(5))

-----选出表中最大的数
local  x= {1,6,5,2,4,1,9,4,3}
function max( tab,fun )
	for i,v in ipairs(x) do
		print(fun(i,v))
	end
end

function compareTo( a,b )
	return a .. b
end

max(x,compareTo)

-------变量的申明
a = 4
local b = 1
function joke(  )
	c = 6
	local d = 2
	-- body
end

joke()
print(a,b)
print(c,d)

----循环

-- while

 a = 1
while(a<10) do 
	print("a: "..a)
	a = a+1
end
---for
for i=10,1,-1 do
    print(i)
end

for i=1,10,1 do
    print(i)
end

local tablex = {"apple","sortfunction"}
for i , v in pairs(tablex) do 
	print(i,v)
end

---repeat  until(boolear)

a = 1
repeat
	print(a)
	a=a+1
until(a>5)

print(type(true))

---- 流程控制

--- if() then body eles body end

if 1==0 then
	print("0 为 true")

else 
	print("0 为 flase")

end
----字符串函数
-----string.upper(argument):字符串全部转为大写字母。
a = "abADd"
bb=string.upper( a )
print(bb)
-- string.lower(argument):字符串全部转为小写字母。
print(string.lower( a ))
--	string.gsub(mainString,findString,replaceString,num)在字符串中替换,mainString为要替换的字符串， 
--findString 为被替换的字符，replaceString 要替换的字符，num 替换次数（可以忽略，则全部替换
print(string.gsub( a,"a","z" ,5))  --返回了两个参数，一个被替换后的参数，一个是替换的个数

--	string.find (str, substr, [init, [end]])在一个指定的目标字符串中搜索指定的内容
--(第三个参数为索引),返回其具体位置。不存在则返回 nil。
print(string.find( a,"AD", 4 ))  --第三个参数为从字符串第index个位置开始查找，可省略
--string.reverse(arg) 字符串反转
print(string.reverse( a ))
--	string.format(...)返回一个类似printf的格式化字符串
print(string.format("the value is:%x",4))
--string.char(arg) 和 string.byte(arg[,int])char 将整型数字转成字符并连接， 
--byte 转换字符为整数值(可以指定某个字符，默认第一个字符)。
print(string.char( 89,56,99,86 ))
print(string.byte( "abcA",4))---该函数只能一次转一个字符也就是插入，
--第二个参数为index，意为将第几个转换成数字，不写默认第一个
---	string.len(arg) 计算字符串长度。
print(string.len( a ))
--string.rep(string, n) 返回字符串string的n个拷贝
print(string.rep( a, 3 ))--第二个参数为拷贝的次数
-- 	.. 链接两个字符串
print("string" .. "hhhh")
---	string.gmatch(str, pattern) 回一个迭代器函数，每一次调用这个函数，返回一个在字符串 str 
--找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到，迭代函数返回nil。

print(string.gsub("hello,up-down!","%A","."))

local str = "12ab34,eed,56"
local func_itor = string.gmatch(str, "%d+")
print(func_itor())
print(func_itor())
print(func_itor())
for i,v in func_itor do
	print(i,v)
end

date = 2; month = 1; year = 2014
print(string.format("日期格式化 %02d/%02d/%05d", date, month, year))

print(string.format("%05d", 17) )

aaa = {}
print(table.maxn(aaa))

for var = 1,10 do
	table.insert( aaa, 1 ,var )
	end

for i,v in ipairs(aaa) do
	print(i,v)
end

-- table.insert( aaa, 1 ,2 )

---多维数组
array={}
for i=1,5 do
	array[i]={}
	for k=1,3 do
		array[i][k] = "holle word  "..k
	end
end

--遍历多维数组
for i=1,table.maxn(array) do
	for j=1,table.maxn(array[i]) do
		print(i.."   "..j,array[i][j])
	end
end

---表的内存地址

myTable ={}
myTable[1]="holle word"
myTable[2]="holle word 2"
myTable2 = myTable
print(myTable2[1])
print(myTable2[2])
myTable2[2]="holle kit"
print(myTable[2])

----表的方法函数

fruits = {"apple","orange","banana"}
--- 表的连接方法
print(table.concat( fruits)) --默认连接
print(table.concat( fruits, ", " )) -- 指定连接字符
print(table.concat( fruits, ", ", 1, 2 )) -- 指定索引来连接 table

--表的插入和移除
table.insert( fruits, "mange" ) --默认末尾插入
print(4,fruits[4])

table.insert( fruits,2, "grapes" ) --指定位置插入
print(2,fruits[2])

table.remove( fruits ) ---默认删除最后一个元素
table.remove( fruits,2 )---删除指定位置元素
for i,v in ipairs(fruits) do
	print(i,v)
end

print("----------------------------------")
---- 排序
fruits2 = {"apple","orange","bananassss"}
---默认排序规则
table.sort( fruits2)
for i,v in ipairs(fruits2) do
	print(i,v)
end
--------自定义规则排序
function cpt( a,b )
	return string.len( a )<string.len( b )
	-- body
end
table.sort( fruits2, cpt )
for i,v in ipairs(fruits2) do
	print(i,v)
end
nums={1,2,3,4,5,9}
print(table.maxn(nums))


require("../module/config_module")
config_module.add(21,33)
config_module.move(11,22)
print(config_module.name )


------元表初识
-- local mt = {}
-- mt._add=function ( a,b )
-- 	print "holle yuansubiao"
-- 	-- body
-- end

-- local t1 = {}
-- local t2 ={}
-- setmetatable(t1, mt)
-- setmetatable(t2, mt)
-- print(t1+t2)


-----文件io操作
path = "/io/test.txt"
file = io.open("io/test.txt","a")
io.output(file)
io.write("this is test.txt open option")
print(file == nil)
io.close(file)


----错误处理

onceParmats = function(i)
	 print(i) 
	 error('error..') 
	end
twoParmats = function() 
	print(debug.traceback()) 
end
xpcall(onceParmats, twoParmats, 33)

 print("this .is null sss")

 print(self)

 ----------排序
 ----冒泡排序
 arr = {1,4,3,7,33,88,22,33,2,3,44}
 function sort_me(  )
 	local len = table.maxn(arr)
 	print(len)
 	for i=1,len do
 		for j=i+1,len do
 			if arr[i]>arr[j] then
 				arr[i],arr[j]=arr[j],arr[i]
 			end
 		end
 	end
 end
sort_me()
for i,v in ipairs(arr) do
	print(i,v)
end

----随机数

if i~=1 then
	print("i donot = 1")
	else
		print("i = 1")
end

----例外

function errorFun( a )
	
	if not tonumber(a) then
		error("a this is not nums")
		else
			print("a this is  nums")
	end
end

b,msg = pcall(errorFun, "16s")
print(b,msg)

---协程
function createCortoin( ... )
	coroutine.create(function ( a,b )
		for i=1,10 do
			print(i,a+b)
			coroutine.yield()
		end
	end)
end

for i=1,10 do
		local a = createCortoin()

end

----闭包
---含义：闭包是函数中函数，可以包含父函数的局部变量的代码块；
-- 可以让这些局部变量的值始终保持在内存中。
---用处：它最大用处有两个，一个是可以读取函数内部
--变量，另一个就是让这些变量的值始终保存在内存中。

--示例
require("bibao")
local nex = myItor(3)
for i=1,10 do
	nex()
end

aaa = {1,2,3,4,5,6}
sss = {"apple","orenge","brnanan"}
for key,item in tableItor(sss) do
	print(key,item)
end

for v in ipairs(sss) do
	print(v)
end

----面向对象

-- local  classUser = require("OO.User")
-- local user = classUser.new()


print("-------------------")
local ceil = math.ceil( 9.2 )
print(ceil)
local cos = math.cos( 9.2)
print(cos)


math.randomseed(os.time())
----然后不断产生随机数
for i=1, 5 do
 print(math.random()) --0-1之间的数
 print(math.random(5)) --1-5之间数
 print(math.random(2,5))--2-5之间数
end


